// Copyright (C) 2023 即时通讯网(52im.net) & Jack Jiang.
// The RainbowChat Project. All rights reserved.
// 
// 【本产品为著作权产品，合法授权后请放心使用，禁止外传！】
// 【本次授权给：<北京小羊驼科技有限公司>，授权编号：<NT231212144350>，代码指纹：<A.702363430.550>，技术对接人微信：<ID: wxid_wbyootvkdcgj22>】
// 【授权寄送：<收件：苏先生、地址：北京市大兴区北京密码西区6号楼1单元301、电话：18613885610、邮箱：bd@huiyuanxiang-inc.com>】
// 
// 【本系列产品在国家版权局的著作权登记信息如下】：
// 1）国家版权局登记名(简称)和权证号：RainbowChat    （证书号：软著登字第1220494号、登记号：2016SR041877）
// 2）国家版权局登记名(简称)和权证号：RainbowChat-Web（证书号：软著登字第3743440号、登记号：2019SR0322683）
// 3）国家版权局登记名(简称)和权证号：RainbowAV      （证书号：软著登字第2262004号、登记号：2017SR676720）
// 4）国家版权局登记名(简称)和权证号：MobileIMSDK-Web（证书号：软著登字第2262073号、登记号：2017SR676789）
// 5）国家版权局登记名(简称)和权证号：MobileIMSDK    （证书号：软著登字第1220581号、登记号：2016SR041964）
// * 著作权所有人：江顺/苏州网际时代信息科技有限公司
// 
// 【违法或违规使用投诉和举报方式】：
// 联系邮件：jack.jiang@52im.net
// 联系微信：hellojackjiang
// 联系QQ号：413980957
// 授权说明：http://www.52im.net/thread-1115-1-1.html
// 官方社区：http://www.52im.net
package com.x52im.rbchat.logic.search;

import android.os.Bundle;
import android.os.Handler;
import android.text.TextUtils;

import com.eva.android.widget.ActivityRoot;
import com.eva.android.widget.SearchInputView;
import com.eva.android.widget.WidgetUtils;
import com.eva.epc.common.util.CommonUtils;
import com.x52im.rbchat.R;
import com.x52im.rbchat.logic.search.content.SearchableContent;
import com.x52im.rbchat.logic.search.impl.SearchImplFragment;

import java.util.ArrayList;
import java.util.List;

/**
 * 搜索功能Activity根类。子类可以继承本类实现支持不同搜索内容的界面。
 *
 * @author JackJiang
 * @since 8.2
 */
public abstract class AbstractSearchActivity extends ActivityRoot {

    public final static String INTENT_KEY_KEYWORD = "keyword";
    public final static String INTENT_KEY_SHOWALLRESULT = "showAllResult";
    public final static String INTENT_KEY_AUTOFOCUSSEARCHINPUTVIEW = "autoFocusSearchInputView";

    /** 用于显示搜索结果列表的子Fragment对象 */
    private SearchImplFragment searchImplFragment = null;
    /** 搜索内容输入控件封装类 */
    private SearchInputView searchInputView = null;

    /** 支持搜索内容类型的集合 */
    private List<SearchableContent> searchableModules = new ArrayList<>();

    /** 本Activity的调用者传进来的：搜索关键字 */
    protected String keywordFromIntent = null;
    /** 本Activity的调用者传进来的：是否显示全部结果（默认false，true表显示全部，false表只显示有限数量，其它需点击"查看更多"） */
    protected boolean showAllResultFromIntent = false;
    /** 本Activity的调用者传进来的：搜索输入框是否自动获得焦点并弹出输入法（默认true） */
    protected boolean autoFocusFromIntent = true;

    @Override
    protected void onPause(){
        super.onPause();
        focusSearchView(false);
    }

    /**
     * 解析从Intent中传过来的可能的数据本方法中实现.
     */
    @Override
    protected void initDataFromIntent(){
        keywordFromIntent = getIntent().getStringExtra(INTENT_KEY_KEYWORD);
        showAllResultFromIntent = getIntent().getBooleanExtra(INTENT_KEY_SHOWALLRESULT, false);
        autoFocusFromIntent = getIntent().getBooleanExtra(INTENT_KEY_AUTOFOCUSSEARCHINPUTVIEW, true);
    }

    /**
     * 本方法由父类的 {@link #init(Bundle)} 调用，子类可在此方法中实现ui的初始化。
     */
    @Override
    protected void initViews(Bundle savedInstanceState){

        //* 养成良好习惯：首先设置主layout，确保后绪的操作中使用到的组件都可以被find到
        setContentView(R.layout.search_activity);

        searchInputView = this.findViewById(R.id.search_input_toolbar_search_input_view);

        // 初始设置搜索框
        setupSearchView();
        // 初始设置搜索结果显示fragment
        setupSearchFragment();
        // 初始设置可搜索内容集合
        setupSearchableContents(searchableModules);
        // 尝试自动搜索默认内容
        layzyAutoSearch();
    }

    /**
     * 本方法由父类的 {@link #init(Bundle)} 调用，子类可在此方法中为各UI功能组件增加事件临听。
     */
    @Override
    protected void initListeners() {
        this.findViewById(R.id.search_input_toolbar_cancel_input).setOnClickListener(v -> finish());
    }

    /**
     * 当输入框中默认就有搜索关键字时，就自动进行搜索。
     */
    private void layzyAutoSearch(){
        if (!TextUtils.isEmpty(keywordFromIntent)) {
            // post的目的是确保延迟执行，避免fragment中的根view尚未设置完成前就进行搜索，进行导致各ui控件引用的是null的问题
            new Handler().post(() -> {
                searchInputView.setKeyword(keywordFromIntent);
            });
        }
    }

    /**
     * 设置搜索输入框控件。
     */
    private void setupSearchView() {
        // 为输入框添加输入事件监听
        searchInputView.setOnQueryTextListener(this::doSearch);
        // 是否自动获得焦点
        focusSearchView(autoFocusFromIntent);
    }

    /**
     * 设置显示搜索结果列表的fragment。
     */
    protected void setupSearchFragment() {
        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.contentLayout, searchImplFragment = new SearchImplFragment())
                .commit();
    }

    /**
     * 设置可搜索内容描述对象集合。
     *
     * @param contends 可搜索内容集合，详见{@link SearchableContent}
     * @see #setupSearchableContentsImpl(List)
     */
    protected final void setupSearchableContents(List<SearchableContent> contends){
        // 设置可搜索内容描述对象
        setupSearchableContentsImpl(contends);
        // 可搜索内容描述对象集合不为空时
        if(contends != null && contends.size() > 0){
            StringBuilder hintContent = new StringBuilder("");

            // 遍历可搜索内容描述对象集合
            for(int i =0; i < contends.size(); i++){
                SearchableContent c = contends.get(i);

                // 根据传进来的showAllResultFromIntent字段，设置各可搜索内容描述对象的对应字段
                c.setShowAllResult(showAllResultFromIntent);

                // 组装可搜索内容的catlog
                hintContent.append(c.getCategory());
                // 如果是最后一个就不需要加顿号分隔了
                if(i != contends.size() - 1){
                    hintContent.append("、");
                }
            }

            // post的目的是确保延迟执行，避免fragment中的根view尚未设置完成前就进行搜索，进行导致各ui控件引用的是null的问题
            new Handler().post(() -> {
                // 更新搜索结果列表中没有开始搜索前的提示信息
                searchImplFragment.updateHint("支持搜索"+ hintContent);
            });
        }
    }

    /**
     * 设置可搜索内容描述对象集合（具体由子类去实现）。
     *
     * @param contents 可搜索内容集合，详见{@link SearchableContent}
     */
    protected abstract void setupSearchableContentsImpl(List<SearchableContent> contents);

    /**
     * 开始搜索。
     *
     * @param keyword 要搜索的关键字
     */
    protected void doSearch(String keyword) {
        if (!CommonUtils.isStringEmpty(keyword)) {
            searchImplFragment.doSearch(keyword, searchableModules);
        } else {
            searchImplFragment.clearResult();
        }
    }

    /**
     * 设置或取消输入框的焦点和输入法。
     *
     * @param focus true表示是，否则不是
     */
    private void focusSearchView(boolean focus){
        // 获得焦点
        if (focus) {
//            // 获得焦点
//            searchInputView.getEditView().requestFocus();
//            // 弹出输入法
//            WidgetUtils.showInputMethod(this);
        } else {
            // 隐藏输入法
            WidgetUtils.hideInputMethod(this, getCurrentFocus());
            // 移除焦点
            searchInputView.getEditView().clearFocus();
        }
    }
}
